# 实现一个 copy 函数，可以从 a 目录 copy 文件到 b 目录

from pathlib import Path


def wrapper(fn):
    def iner(source, destnation, parents=False):
        src = Path(source)
        dst = Path(destnation)
        if '*' == src.name and dst.is_dir():  # 目录复制,格式src\* dst\
            _traverse_dir(src.parent, dst)
        elif '*' in src.name and dst.is_dir():  # 检查路径名称是否带*，同时目标要是路径,支持通配复制,格式src\*.txt dst\
            for file in src.parent.rglob(src.name) if parents else src.parent.glob(src.name):
                (dst / file.name).touch(exist_ok=True)
                fn(file, dst / file.name)
        elif src.is_file():
            if dst.is_file():  # 目标对象是文件,格式src\file  dst\file
                print('目标文件将被覆盖')
                fn(src, dst)
            elif dst.is_dir():  # 目标对象是目录，格式src\file dst
                (dst / src.name).touch(exist_ok=True)
                fn(src, (dst / src.name))
            else:
                print('输入的路径不正确')
        else:
            print('输入的路径存在错误')

    return iner


def _traverse_dir(src, dst):
    for file in src.iterdir():  #遍历目录，文件直接复制，文件夹进行递归
        if file.is_file():
            copy_file(file, dst)
        else:
            (dst / file.name).mkdir(exist_ok=True)
            _traverse_dir(file, dst / file.name)


@wrapper
def copy_file(fsrc, fdst):
    buffer_size = 64
    with fsrc.open('rb') as f1:
        with fdst.open('wb') as f2:
            while True:
                contenet = f1.read(buffer_size)
                if not contenet:
                    break
                f2.write(contenet)


copy_file('*', r'd:\oo')
# 不用对文件进行读写，就像复制粘贴文件一样